﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Noris.Schedule.Support;
using Noris.Schedule.Support.Services;

using Noris.Schedule.Planning.ProcessData;
using Noris.Schedule.Planning.DataFace;
using Noris.Schedule.Support.Sql;

namespace Noris.Schedule.Planning.Services
{
	/// <summary>
	/// Výkonná třída, která provádí nevizuální funkci (Cowley) "RunProcess".
    /// Funkci lze vyvolat z příkazové řádky parametrem: Cowley=RunProcess
    /// Volitelně lze zadat parametr SkipSave=yes pak plánovací proces načte data, zaplánuje, ale plán neukládá.
    /// Plánovací proces plánuje verzi plánu specifikovanou parametrem Dv=číslosubjektu .
	/// </summary>
	public class RunPlanningProcessCwl : Cowley
	{
		/// <summary>
		/// Zde Cowley vrací svoji identifikaci (číslo, název, cokoliv), jako string.
		/// Podle této identifikace se určuje, která výkonná třída provede konkrétní funkci.
		/// </summary>
		public override string CowleyID { get { return "RunProcess"; } }
		/// <summary>
		/// Vstupní bod Cowley.
		/// Jakékoli parametry (předané v příkazové řádce) si může vyzvednout přes Steward.ParamGet(name).
		/// Pro zobrazování progresu jsou určeny metody Steward.CowleyProgressInit() a Steward.CowleyProgress().
		/// </summary>
		public override void Run()
		{
			// Parameters = 
			// Login=AsLCS D=localW7.NV43_source
			// W=c:\inetpub\wwwroot\noris43\noris\bin\noris.dll Us=157529 Dv=135103 Sc=RGF0YSBTb3VyY2U9REFKLTctRFxEQUpfN19EO0luaXRpYWwgQ2F0YWxvZz1ub3Jpc1Z5dm9qNDNfc291cmNlO0ludGVncmF0ZWQgU2VjdXJpdHk9RmFsc2U7VXNlciBJRD1uZXRhZG1pbjtQYXNzd29yZD1zYXJ1bWFuO011bHRpcGxlQWN0aXZlUmVzdWx0U2V0cz1GYWxzZTtDb25uZWN0IFRpbWVvdXQ9MTQ0MDA7RW5jcnlwdD1GYWxzZTtDdXJyZW50IExhbmd1YWdlPQ== D=localW7.NV43_source ProfileList=Disable S=8250888516578486024 Cowley=RunProcess
            // W=c:\inetpub\wwwroot\noris43\noris\bin\noris.dll Sc=RGF0YSBTb3VyY2U9REFKLTctRFxEQUpfN19EO0luaXRpYWwgQ2F0YWxvZz1OVjQzX3NvdXJjZTtJbnRlZ3JhdGVkIFNlY3VyaXR5PUZhbHNlO1VzZXIgSUQ9bmV0YWRtaW47UGFzc3dvcmQ9c2FydW1hbjtNdWx0aXBsZUFjdGl2ZVJlc3VsdFNldHM9RmFsc2U7Q29ubmVjdCBUaW1lb3V0PTE0NDAwO0VuY3J5cHQ9RmFsc2U7Q3VycmVudCBMYW5ndWFnZT0= D=localW7.NV43_source ProfileList=Disable Us=157529 Dv=135103 S=7041454700428373301 Cowley=RunProcess
            //      ...   SkipSave=yes

            try
            {
                Cowley.Login();
                Cowley.CheckPermission(Noris.Schedule.Planning.ProcessData.Constants.FunctionNumberPlanningProcess);

                PlanCVersionHdrCls dataVersion = _GetParamDv();
                PlanVariatorManager.PrepareDefaultVariationId();
                using (PlanningDataCls planning = new PlanningDataCls(null))
                {
                    planning.DoProgressTarget = this as ICallBackTarget;         // this je potomkem CowleyBase, tím tedy dědí metody, které zajišťují předávání progresu do Stewarda
                    using (Cowley.ProgressCreateSegment(0.00M, 0.40M))
                    {
                        planning.ActivateDataVersion(dataVersion.RecordNumber);
                        planning.CheckPlanningProcessState(PlanningProcessState.NowEditing);
                        planning.DataPrepare(true);
                    }
                    using (Cowley.ProgressCreateSegment(0.40M, 0.65M))
                    {
                        planning.RunPlanningProcess();
                    }
                    using (Cowley.ProgressCreateSegment(0.65M, 1.00M))
                    {
                        string skipSave = Steward.ParamGet("SkipSave", false);
                        bool save = (skipSave == null || skipSave != "yes");
                        if (save)
                            planning.DataSave();
                    }
                }
            }
            catch (Exception exc)
            {
                Steward.Audit(AuditRowType.ApplicationError, "Došlo k chybě: " + exc.Message, exc);
            }
			finally
			{
				Cowley.Logout();
			}
		}
		/// <summary>
		/// Získá data parametru plánovacího procesu = řídící data 
		/// (objekt třídy PlanCVersionHdrCls (Kapacitní plán verze), který obsahuje řídící parametry plánovacího procesu).
		/// </summary>
		/// <returns></returns>
		private PlanCVersionHdrCls _GetParamDv()
        {
            string errorMessage;
            PlanCVersionHdrCls version = PlanningComponentCls.GetVersionFromParam(out errorMessage);
            if (version == null)
                Throw.InputError(errorMessage);

            return version;
		}
	}
}
